#!/bin/bash
# numeron lukeminen näppäimistöltä siten ettei merkkejä kirjoitettaessa merkkiä hyväksytä ellei merkki ole mahdollinen silläkohtaa. 134 169
 
function lue_luku () {
numero=''; sallitutmerkit=+-.e0123456789; clear
while true; do
  read -rsN 1 merkki
  [[ $(echo $merkki | od | awk '{print $2}') = 005177 ]] && [[ ! -z $numero ]] && apu=${#numero} && numero=${numero:0:apu-1} && clear && echo -n $numero && continue # BS pyyhkii viimeisen numeron
  merkki=$(echo $merkki | tr , .)                                        # desimaalipilkkua ei hyväksytä vaan muutetaan se pisteeksi
  [[ -z $merkki ]] && exit                                               # enteriä painettu
  [[ $merkki = . && $(echo $numero | grep e) ]] && continue              # pistettä ei hyväksytä e:n jälkeen
  [[ $merkki = e && ${numero:${#numero}-1} != [0-9] ]] && continue       # e:tä ei hyväksytä mikäli edellinen merkki ei ole numero
  [[ $( echo $merkki | tr -d $sallitutmerkit) ]] && continue             # mitään merkkiä ei koskaan hyväksytä ellei se kuulu sallittuihin merkkeihin.  
  sallitutmerkit=$(echo $sallitutmerkit | tr -d +-)                      # + ja - sallitaan vain alussa
  [[ $merkki = . ]] && sallitutmerkit=$(echo $sallitutmerkit | tr -d .)  # luvussa ei saa olla kahta pistettä.
  numero=$numero$merkki
  [[ $(echo $numero | grep e.*e) ]] && continue                          # vain yksi e sallitaan  
  [[ ${numero:${#numero}-1} = e ]] && sallitutmerkit="+-"$sallitutmerkit # heti e:n jäljessä voi taas olla yksi + tai -
  echo -n $merkki  
done ;}

lue_luku
